/*
unified_seq 
- 提供 seqptr<item_t>、ranger<item_t> 两种标准
- 优先使用 seqptr<item_t> 以实现完整性能
- 当需要使用反序功能时才会选择 ranger<item_t>
- seqptr<item_t> 仅支持正序范围的切片访问
*/
#ifndef xpack_meta_unified_seq
#define xpack_meta_unified_seq
#pragma push_macro("xuser")
#undef  xuser
#define xuser mixc::meta_unified_seq::inc
#include"define/base_type.hpp"
#include"define/classify.hpp"
#include"macro/xexport.hpp"
#include"interface/ranger.hpp"
#include"interface/seqptr.hpp"
#include"meta/is_same.hpp"
#include"meta/item_of.hpp"
#include"meta/remove_ref.hpp"
#pragma pop_macro("xuser")

namespace mixc::meta_unified_seq{
    template<class seq_t, bool>
    struct meta;

    template<inc::can_seqptrlize seq_t>
    struct meta<seq_t, true>{
        // 不使用 inc::item_origin_of<seq_t> 避免移除必要的 const 修饰符
        using item_t = inc::remove_ref<inc::item_of<seq_t>>;
        using result = inc::seqptr<item_t>;
    };

    template<inc::can_rangerlize seq_t>
    struct meta<seq_t, false>{
        // 不使用 inc::item_origin_of<seq_t> 避免移除必要的 const 修饰符
        using item_t = inc::remove_ref<inc::item_of<seq_t>>;
        using result = inc::ranger<item_t>;
    };
}

namespace mixc::meta_unified_seq::origin{
    template<class seq_t>
    concept can_unified_seqlize = 
        inc::can_seqptrlize<seq_t> or inc::can_rangerlize<seq_t>;

    template<class seq_t, class item_t>
    concept can_unified_seqlizex = 
        inc::can_seqptrlizex<seq_t, item_t> or inc::can_rangerlizex<seq_t, item_t>;

    template<can_unified_seqlize seq_t>
    using unified_seq = typename meta<seq_t, inc::can_seqptrlize<seq_t> == true>::result;

    template<class type_t>
    concept is_unified_seq = inc::is_ranger<type_t> or inc::is_seqptr<type_t>;

    template<class type_t, class item_t>
    concept is_unified_seqx = (inc::is_ranger<type_t> or inc::is_seqptr<type_t>) and 
        inc::is_same<
            inc::remove_ref<inc::item_of<type_t>>,
            item_t
        >;
}

#endif

xexport_space(mixc::meta_unified_seq::origin)